package com.newstore.database;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.newstore.classes.Barcode;
import com.newstore.classes.Product;

/** 
 * Permet de faire le lien entre les objets Barcode et la base de données
 * @author Guillaume
 * @version 1.0
*/
public class ProductDatabase
{
	private SQLiteDatabase databaseQueries;
	private BarcodeDatabase barcodeDatabase;
	
	/**
	 * Constructeur
	 * @param databaseQueries Base de données où les requêtes vont s'effectuer
	 */
	public ProductDatabase(SQLiteDatabase databaseQueries)
	{
		this.databaseQueries = databaseQueries;
		this.barcodeDatabase = new BarcodeDatabase(this.databaseQueries);
	}
	
	/**
	 * Effectue une requête pour retourner un product à partir d'un id
	 * @param productId Id du product souhaité
	 * @return Le product souhaité
	 */
	public Product getProductFromId(int productId)
	{
		Cursor cursorProduct = databaseQueries.query(DatabaseNewstore.TABLE_PRODUCT, new String[] {"id", DatabaseNewstore.COL_NAME, DatabaseNewstore.COL_REFERENCE, DatabaseNewstore.COL_LOCATION, 
				DatabaseNewstore.COL_CATEGORY, DatabaseNewstore.COL_BARCODE, DatabaseNewstore.COL_STOCK},
				"id = " + productId, null, null, null, null);
		return productCursor(cursorProduct);
	}
	
	/**
	 * Permet de récupérer un barcode à partir de son barcode
	 * @param barcode Barcode du produit
	 * @return Le produit avec le barcode
	 */
	public Product getProductFromBarcode(Barcode barcode)
	{
		int idBarcode = this.barcodeDatabase.getBarcodeFromBarcode(barcode).getId();
		Cursor cursorOrder = databaseQueries.query(DatabaseNewstore.TABLE_PRODUCT, new String[] {"id"}, DatabaseNewstore.COL_BARCODE + " = " + idBarcode, null, null, null, null);
		cursorOrder.moveToNext();
		return this.getProductFromId(cursorOrder.getInt(0));
	}
	
	/**
	 * Permet de mettre à jour le stock d'un produit à partir de son id
	 * @param productId
	 * @param newStock
	 * @return
	 */
	public long updateStockProductFromId(int productId, int newStock)
	{
		ContentValues values = new ContentValues();
		
		values.put(DatabaseNewstore.COL_STOCK, newStock);
		return this.databaseQueries.update(DatabaseNewstore.TABLE_PRODUCT, values, "id = " + productId, null);
	}
	
	/**
	 * Modifie la commande selon l'id pour modifier le barcode
	 * @param productId Id de la commande à update
	 * @param idBarcode Id du barcode à ajouter
	 * @return Le nombre de colonnes affectées
	 */
	public long updateProductFromId(int productId, int idBarcode)
	{
		ContentValues values = new ContentValues();
		
		values.put(DatabaseNewstore.COL_BARCODE, idBarcode);
		return this.databaseQueries.update(DatabaseNewstore.TABLE_PRODUCT, values, "id = " + productId, null); 
	}
	
	/**
	 * Insère un product dans la base de données
	 * @param product Product que l'on souhaite insérer dans la base de données
	 * @return L'id du product inséré
	 */
	public long insertProduct(Product product)
	{
		ContentValues values = new ContentValues();
		values.put(DatabaseNewstore.COL_NAME, product.getName());
		values.put(DatabaseNewstore.COL_REFERENCE, product.getReference());
		values.put(DatabaseNewstore.COL_CATEGORY, product.getCategory());
		values.put(DatabaseNewstore.COL_LOCATION, product.getLocation());
		values.put(DatabaseNewstore.COL_STOCK, product.getStock());
		//values.put(DatabaseNewstore.COL_BARCODE, (int)this.barcodeDatabase.insertBarcode(product.getBarcode()));
		
		return this.databaseQueries.insert(DatabaseNewstore.TABLE_PRODUCT, null, values);
	}
	
	/**
	 * Cursor qui permet d'avoir un product grâce à une requête
	 * @param cursor Cursor qui permet de parcourir la requête
	 * @return Le product rempli
	 */
	private Product productCursor(Cursor cursor)
	{
		if (cursor.getCount() == 0)
			return null;
		
		cursor.moveToFirst();
		Product product = new Product(cursor.getInt(0), cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), cursor.getInt(6));
		int barcodeId = cursor.getInt(5);
		cursor.close();
		product.setBarcode(this.barcodeDatabase.getBarcodeFromId(barcodeId));
		return product;
	}
}
